# 导入tkinter库和time模块
from tkinter import *
import time


class 秒表(Frame):
    '''实现一个秒表部件'''
    刷新间隔 = 50  # 每50毫秒刷新一次显示

    def __init__(self, 父窗口=None, **参数):
        Frame.__init__(self, 父窗口, 参数)
        self.开始时间 = 0.0
        self.已过时间 = 0.0
        self.正在运行 = False
        self.时间文本 = StringVar()
        self.创建组件()
        self.首次运行 = True

    def 创建组件(self):
        '''制作时间标签'''
        标签 = Label(self, textvariable=self.时间文本, justify=LEFT)
        self.设置时间显示(self.已过时间)
        标签.pack(fill=X, expand=NO, pady=2, padx=2)

    def 更新时间(self):
        '''更新显示的时间'''
        self.已过时间 = time.time() - self.开始时间
        self.设置时间显示(self.已过时间)
        self.定时器 = self.after(self.刷新间隔, self.更新时间)

    def 设置时间显示(self, 时间值):
        '''将时间格式改为 分：秒：百分秒'''
        分钟 = int(时间值 / 60)
        秒 = int(时间值 - 分钟 * 60.0)
        百分秒 = int((时间值 - 分钟 * 60.0 - 秒) * 100)
        self.时间文本.set(f'{分钟:02d}:{秒:02d}:{百分秒:02d}')

    def 开始(self):
        '''开始计时'''
        if not self.正在运行:
            self.开始时间 = time.time() - self.已过时间
            self.更新时间()
            self.正在运行 = True

    def 停止(self):
        '''停止秒表'''
        if self.正在运行:
            self.after_cancel(self.定时器)
            self.已过时间 = time.time() - self.开始时间
            self.设置时间显示(self.已过时间)
            self.正在运行 = False

    def 重置(self):
        '''重设秒表'''
        self.开始时间 = time.time()
        self.已过时间 = 0.0
        self.设置时间显示(self.已过时间)

    def 显示秒表(self):
        '''显示秒表界面'''
        if self.首次运行:
            self.pack(side=TOP)
            Button(self, text='开始', command=self.开始).pack(side=LEFT)
            Button(self, text='停止', command=self.停止).pack(side=LEFT)
            Button(self, text='重置', command=self.重置).pack(side=LEFT)
            Button(self, text='退出', command=self.quit).pack(side=LEFT)
        self.首次运行 = False


if __name__ == '__main__':
    def 主函数():
        根窗口 = Tk()
        根窗口.title('秒表计时器')
        根窗口.geometry('190x80')
        秒表实例 = 秒表(根窗口)
        秒表实例.显示秒表()
        根窗口.mainloop()
    主函数()
